package com.sz.biz.logistics.ord.service;

import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;
import com.sz.biz.logistics.bill.dto.BillingDto;
import com.sz.biz.logistics.bill.dto.BillingGenerateDto;
import com.sz.biz.logistics.ord.entity.OrdServiceBill;

import java.util.Date;
import java.util.List;

/**
 * Function: 服务订单的计费service <br>
 * Author: hpeng.wang <br>
 * Date: 2017-03-31 13:46:00
 */

public interface OrdServiceBillService {
    /**
     * 新增
     *
     * @param entry 新增的实体
     * @return 新增是否成功
     */
    void save(OrdServiceBill entry);

    /**
     * 根据主键id删除实体
     *
     * @param id 主键id
     */
    int delete(Integer id);

    /**
     * 根据主键id删除实体
     *
     * @param ids 主键id集合
     */
    void batchdelete(List<Integer> ids);

    /**
     * 批量修改实体
     *
     * @param list
     */
    void batchUpdate(List<OrdServiceBill> list);

    /**
     * 更新实体
     *
     * @param entry 更新的实体
     * @return 新增是否成功
     */
    int update(OrdServiceBill entry);


    /**
     * 根据主键Id查询单个实体
     *
     * @param id 主键id
     * @return 查询出来的实体对象
     */
    OrdServiceBill findById(Integer id);

    /**
     * 根据id集合查询实体
     *
     * @param ids
     * @return
     */
    List<OrdServiceBill> findByIds(List<Integer> ids);

    /**
     * 根据单号和类型
     *
     * @param orderNo orderNo
     * @param type    1采购价 2销售价
     * @return
     */
    List<OrdServiceBill> findByOrderNoAndType(String orderNo, int type);

    /**
     * 根据单号和类型
     *
     * @param orderNo orderNo
     * @param type    1采购价 2销售价
     * @return
     */
    void deleteByOrderNoAndType(String orderNo, int type);

    /**
     * 根据条件查询实体
     *
     * @param params 查询的参数集
     * @return 查询出的数据
     */
    QResultDto findByParam(QueryParams params);


    void checkCode(int sid, String code);


    /**
     * 删除某个订单的账单
     */
    void deleteByOrderNo(String orderNo);

    /*
     * 账单管理添加接口
     * 获取需要生成的账单的信息
     * @param customerIds
     * @param startEffectTime
     * @param endEffectTime
     * @return
     */
    // BillingDto preGenerateBilling(List<Integer> customerIds, Date startEffectTime, Date endEffectTime,String type);

//    /**
//     * 账单管理添加接口
//     * 根据客户id，已收获时间段获取订单
//     *
//     * @param customerId
//     * @param startEffectTime
//     * @param endEffectTime
//     * @param isBilled
//     * @return
//     */
//    List<BillingGenerateDto> getOrderByCustomerIdAndCreateTime(Integer customerId, Date startEffectTime, Date endEffectTime, Boolean isBilled,String type);

    /**
     * 子帐号账单管理添加接口
     * 根据帐号id，已收获时间段获取订单
     *
     * @param customerId
     * @param startEffectTime
     * @param endEffectTime
     * @param isBilled
     * @return
     */
    //List<BillingGenerateDto> getOrderByUserIdAndCreateTime(Integer customerId, Date startEffectTime, Date endEffectTime, Boolean isBilled);

    /**
     * 没有汇率的订单
     *
     * @param customerIdList
     * @param startEffectTime
     * @param endEffectTime
     * @return
     */
    List<OrdServiceBill> getOrderNotExchangeRateByCustomerIdAndCreateTime(List<Integer> customerIdList, Date startEffectTime, Date endEffectTime, String type);

    /**
     * 获取订单数量
     *
     * @param customerIdList
     * @param startEffectTime
     * @param endEffectTime
     * @param isBilled
     * @return
     */
    List<BillingGenerateDto> getOrderForBillingTask(List<Integer> customerIdList, Date startEffectTime, Date endEffectTime, Boolean isBilled, String type);

    /**
     * 更新是否已经生成账单状态
     *
     * @param orderNos
     * @param isBilled
     */
    void updateIsBilledStatus(List<String> orderNos, Boolean isBilled, String type, Integer supplier);

    /**
     * 更新
     *
     * @param ordServiceBill
     */
    void updateExchangeRate(OrdServiceBill ordServiceBill);

    /**
     * 获取没有汇率的单
     *
     * @return
     */
    List<OrdServiceBill> findExchangeRateEmpty();

    /**
     * 按单号获取计算出来的值
     *
     * @return List<OrdServiceBill>
     */
    List<OrdServiceBill> findByOrderNos(Integer customerId, List<String> orderNos);

    /*
    * 账单管理添加接口
    * 获取需要生成的客户账单的信息
    * @param customerIds
    * @param startEffectTime
    * @param endEffectTime
    * @return
    */
    BillingDto preGenerateCustomerBilling(List<Integer> customerIds, Date startEffectTime, Date endEffectTime, String type);

    /*
   * 账单管理添加接口
   * 获取需要生成的供应商账单的信息
   * @param customerIds
   * @param startEffectTime
   * @param endEffectTime
   * @return
   */
    BillingDto preGenerateSupplierBilling(List<Integer> customerIds, Date startEffectTime, Date endEffectTime, String type);

    /**
     * 账单管理添加接口
     * 根据客户id，已收获时间段获取订单
     *
     * @param customerId
     * @param startEffectTime
     * @param endEffectTime
     * @param isBilled
     * @return
     */
    List<BillingGenerateDto> getOrderByCustomerAndCreateTime(Integer customerId, Date startEffectTime, Date endEffectTime, Boolean isBilled);

    /**
     * 账单管理添加接口
     * 根据供应商标id，已收获时间段获取订单
     *
     * @param customerId
     * @param startEffectTime
     * @param endEffectTime
     * @param isBilled
     * @return
     */
    List<BillingGenerateDto> getOrderBySupplierAndCreateTime(Integer customerId, Date startEffectTime, Date endEffectTime, Boolean isBilled);

    /**
     * 按照日期获取计费时间内的订单
     *
     * @param type
     * @param dayBegin
     * @param dayEnd
     */
    List<OrdServiceBill> findByDate(int type, Date dayBegin, Date dayEnd);

    /**
     * 根据订单号集合查询
     *
     * @param orderNos 订单集合
     * @param customerId 客户id
     * @return OrdServiceBills 费用明细集合
     * @author Fengwj
     * @date 2017/12/27
     */
    List<OrdServiceBill> getByOrderNos(List<String> orderNos, Integer customerId);
}
